package com.xl.event.publisher;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

/**
 * ApplicationEventPublisherAware 是一个标记接口，
 * 用于为 Spring 管理的 bean 注入 ApplicationEventPublisher 实例。
 * 当一个 bean 实现了 ApplicationEventPublisherAware 接口，
 * 并在其内部定义了 setApplicationEventPublisher() 方法时，
 * Spring 容器会在创建该 bean 的过程中自动调用该方法，并将 ApplicationEventPublisher 实例注入到该 bean 中。
 */
@Component
public class EventPublisherAware implements ApplicationEventPublisherAware {

    //有地方说这里如果是静态的，虽然下面有个一set方法但是不会被spring注入进来
    private static ApplicationEventPublisher applicationEventPublisher;

    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    /**
     * 上面两个代码就箱单于是给这个类里面注入了 applicationEventPublisher 对象，用于发布事件
     *
     * @param applicationEvent
     */

    public static void publishEvetn(ApplicationEvent applicationEvent) {
        applicationEventPublisher.publishEvent(applicationEvent);
    }

}
